package net.bingosoft.common.util;

import java.util.Locale;
import java.util.Properties;

import net.bingosoft.common.EncodedProperties;

import org.springframework.util.Assert;

/**
 * Nov 12, 2008 10:53:52 AM
 * Author:yangdongyu(yangdy@bingosoft.net)
 * ReadMe:获取本地化语言的工具类.该类可以从国际化语言文件中查找指定key值对应的本地化语言.
 * 		  国际语言文件(i18n文件)的编码默认是ISO-8859-1,如果语言文件的编码类型不是ISO-8859-1,请在语言文件中加入一项ENCODING=实际编码.如 ENCODING=UTF-8.
 *        
 *        语言文件中需要设定一项值I18N_LANGUAGE_ORDER来表明多国语言的排序方式.不同类型的语言之间用逗号分割,如I18N_LANGUAGE_ORDER=zh_CN,en
 *        表明从key检索到的value值包含两种语言:中文和英文,中文排列在先,英文在后.
 *        
 *        语言文件中一个key值对应key值的一组语言表示,它们用逗号分割并按照I18N_LANGUAGE_ORDER指定的顺序排列
 *        
 *        语言文件可以由多个组成,但它们需要放置在类路径下i18n目录下面,并且扩展名称是 i18n.properties ,如grid.i18n.properties
 * 
 * ChangeLog:
 */
public class I18NUtil {
	/**
	 * 语言字典的位置,默认位置在classpath*:/i18n/*.i18n.properties
	 */
	private static final String dictionaryLocation = "classpath*:/i18n/*.properties";
	/**
	 * 语言的排序顺序
	 */
	private static String []I18N_LANGUAGE_ORDER = {"zh_CN"} ;
	/**
	 * 语言字典
	 */
	private Properties dictionary;

	private static I18NUtil instance;

	private I18NUtil(){}

	/**
	 * 获取该类的一个实例
	 */
	public synchronized static I18NUtil getInstace(){
		if(instance == null){
			instance = new I18NUtil();
			instance.dictionary = EncodedProperties.getInstance(dictionaryLocation, true);
			if(StringHelper.isNotEmpty(instance.dictionary.getProperty("I18N_LANGUAGE_ORDER"))){
				I18N_LANGUAGE_ORDER = instance.dictionary.getProperty("I18N_LANGUAGE_ORDER").split(",");
			}
		}
		return instance;
	}

	/**
	 * 获取key值对应的本地化语言,如果没有找到对应的本地化语言的定义,返回key值.
	 * @param key 本地化语言对应的key值,不能为null或者空字符串,key值可以为中文字符串
	 * @param locale 标示语言和地域的Locale对象
	 * @return 本地化的语言
	 */
	public String getLocalizedMessage(String key ,Locale locale){
		//parameters check
		Assert.notNull(key, "parameter key can not be null ...");
		Assert.notNull(locale, "parameter locale can not be null ...");

		if(this.dictionary == null) return key;
		//get 
		String localeString = locale.toString();
		String localeLanguages = dictionary.getProperty(key);
		if(localeLanguages == null) return key;

		for(int i = 0 ;  i < I18N_LANGUAGE_ORDER.length ;i++){
			if(localeString.startsWith(I18N_LANGUAGE_ORDER[i])){
				String langs [] = localeLanguages.split(",");
				if(langs.length > i ){
					return langs[i];
				}
			}
		}
		return key;
	}

	public static void main(String[] args) {
		String name = I18NUtil.getInstace().getLocalizedMessage("杨东宇", Locale.CHINESE);
		System.out.println(name);
	}

}
